package com.genericity.demo02;

public class Test {
    public static void main(String[] args) {
        System.out.println("使用泛型类");
        // 1.定义字符串的泛型类
        Generic<String> strGeneric = new Generic<>("kerry");
        System.out.println(strGeneric.getKey());

        Generic<String> strGeneric2 = new Generic<>();
        System.out.println(strGeneric2.getKey());
        System.out.println("============");
        // 2.定义整数型的泛型类
        Generic<Integer> intGeneric = new Generic<>(1000);
        System.out.println(intGeneric.getKey());

        /**
         * 思考一个问题：定义的泛型类，就一定要传入泛型类型实参么？
         * 并不是这样，在使用泛型的时候如果传入泛型实参，则会根据传入的泛型实参做相应的限制，此时泛型才会起到本应起到的限制作用。
         * 如果不传入泛型类型实参的话，在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。
         */
        // 例子
        Generic generic1 = new Generic<>("12313");
        Generic generic2 = new Generic<>(5555);
        Generic generic3 = new Generic<>(55.55);
        Generic generic4 = new Generic<>(false);
        generic1.setKey(1231321);
        // 没有指定数据类型，按照Object类型来操作
        Object key = generic1.getKey();
        System.out.println("泛型测试："+generic1.getKey());
        System.out.println("泛型测试："+generic2.getKey());
        System.out.println("泛型测试："+generic3.getKey());
        System.out.println("泛型测试："+generic4.getKey());

        // 同一泛型，根据不同的数据类型创建的对象，本质上是同一类型
        System.out.println(intGeneric.getClass());
        System.out.println(strGeneric.getClass());
        System.out.println(intGeneric.getClass() == strGeneric.getClass());
        System.out.println(intGeneric.hashCode());
        System.out.println(strGeneric.hashCode());
    }
}
